home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Utilities Professional 1-1500
/
Utilities Professional 1-1500 (1994)(WPD)[!].iso
/
12511500
/
var1293.dms
/
var1293.adf
/
MATHDRILL
(
.txt
)
< prev
next >
Wrap
AmigaBASIC Source Code
|
1989-10-04
|
12KB
|
438 lines
GOTO redux:
recoup:
CLS
STOP
redux:
ON BREAK GOSUB recoup:
BREAK ON
start:
' Math Drill by Alex Bogomolny
DEFINT a-z:WIDTH "scrn:",80
DIM titles$(3):PosReply=18:NegReply=12
DIM sp$(PosReply+NegReply)
RANDOMIZE TIMER:ON BREAK GOSUB ExitProgram:BREAK ON
SCREEN 1,320,200,2,1:WIDTH ,80
WINDOW 2,"Math Drill",,0,1:WINDOW OUTPUT 2
LOCATE 5,3
GOSUB ReadData:GOSUB SetMenu:ON MENU GOSUB ProcessMenu
GOSUB ChooseColors
SAY "THAENKS. WEHLKAHM TUW DHEH MAE3TH DRIYL."
GOSUB RequestSelection
MainStart:
RANDOMIZE TIMER
score=6:count=0
IF oldchoice=0 GOTO MainStart
IF oldchoice=5 THEN ExitProgram
WHILE score<25
choice=oldchoice
RepeatAfterWrongAnswer:
GOSUB ChooseColors
GOSUB DrawTitle
GOSUB DigitsChoice
GOSUB ScoreColumn
GOSUB GiveProblem
GOSUB GetAnswer
IF answer=axb THEN GOSUB Correct :ELSE GOSUB Wrong
WEND
GOSUB RequestSelection
GOTO MainStart
ExitProgram:
SAY "SIY2 YUW AXGEY3N SUW6N."
MENU OFF:WINDOW CLOSE 2:SCREEN CLOSE 1:WINDOW 1:WINDOW OUTPUT 1
GOTO recoup
'
RequestSelection:
CLS
SAY "MEY3K YOHR CHOY4S."
oldchoice=0
GOSUB DigitsChoice
RETURN
ReadData:
DECLARE FUNCTION Move LIBRARY
LIBRARY "graphics.library":RP&=WINDOW(8)
bckgr=0:forgr=1:boxclr=2:flush=3
stp=2:Maximum=100:MenuOn=0
FOR i=0 TO 3:READ titles$(i):NEXT
DATA "ADDITION","SUBTRACTION","MULTIPLICATION","DIVISION"
FOR i=0 TO PosReply+NegReply:READ sp$(i):NEXT
DATA "UWRX TEHRIY4FIXK.","AO9BOY7.","GUH3D DJAA6B.","FAY9N."
DATA "KAH2NGRXAH3CHUHLEY8SHNS.","DHAE2TS GUH4D."
DATA "GUH2D FAXR YUW5.","NAYS DJAAB.","DHAE2TS GREY6T."
DATA "YUW2RX GREY6T.","YUW2L MEY8K IHT.","VEH3RIH GUW6D."
DATA "AY AXM PRAW3D AXV YUW3.","YUW2 DIH5D IHT.","WEH2L DAH4N."
DATA "YUW MEYK MIH /HAE4PIH.","GREY9T.","DHAETS RAY4T.","KAX2REH5KT."
DATA "/HAW4Z DHAE2T?","AO2 /HOH /HOH5.","ROH6NG.","AY AXM SAA5RIH."
DATA "TRAY AXGEY4N.","THIH4NK BEH6TEH2RX.","AA YUW SHUW3R?"
DATA "YUW3 BEH9T.","KAXM AO2N.","OH KAX3M AO2N.","IHNDIY2D?"
DATA "AA YUW SIY4RIHEH2Z?"
RETURN
RETURN
ScoreColumn:
LINE (290,0)-(309,199),forgr,bf
LINE (290,194-8*score)-(309,199),boxclr,bf
LINE (290,0)-(309,186),forgr,b:LINE(291,1)-(308,185),bckgr,b
FOR i=2 TO score
i8=i*8
LINE(291,193-i8)-(308,193-i8),bckgr
LINE(301,196-i8)-(303,198-i8),forgr:LINE(303,198-i8)-(306,195-i8),forgr
NEXT
RETURN
DigitsChoice:
FOR i=0 TO 9
LINE (7+i*24,155)-(30+i*24,172),boxclr,bf
COLOR ,boxclr:CALL Move&(RP&,13+i*24,167)
PRINT RIGHT$(STR$(i),1);
LINE (7+i*24,155)-(30+i*24,172),forgr,b
NEXT
LINE (173,35)-(246,80),boxclr,bf
LINE (173,92)-(246,136),boxclr,bf
LINE (173,35)-(246,80),forgr,b
LINE (173,92)-(246,136),forgr,b
CALL Move&(RP&,202,60):PRINT "OK":CALL Move&(RP&,182,116):PRINT "CANCEL"
RETURN
DrawTitle:
t$=titles$(choice-1):nt=(30-LEN(t$))/2:LOCATE 1,nt:PRINT t$
RETURN
GiveProblem:
IF answer<>axb THEN GOSUB DrawProblem:RETURN
a=INT(RND*(Maximum+1))
ON choice GOSUB Addition,Subtraction,Multiplication,Division
GOSUB DrawProblem
RETURN
Addition:
sign$="+":b=INT(RND*(Maximum+1-a)):axb=a+b:RETURN
Subtraction:
sign$="-":b=INT(RND*(Maximum+1)):IF b>a THEN SWAP a,b
axb=a-b:RETURN
Multiplication:
sign$="x":b=INT(RND^1.2*(Maximum+1)):axb=a*b:RETURN
Division:
sign$=":":b=INT(RND^1.2*(Maximum+1)):IF b=0 GOTO Division
axb=a:a=a*b:RETURN
SUB DrawP(x,h) STATIC
DEFINT a-z
x$=MID$(STR$(x),2):l=LEN(x$):ll=l
FOR i=1 TO l
v=VAL(LEFT$(x$,1))
'SOUND RND*150+200,2,48,0: SOUND RND*150+200,2,48,1
'SOUND RND*150+200,2,48,2: SOUND RND*150+200,2,48,3
CALL DisplayOneDigit(112,l,i,24,h,v)
ll=ll-1:IF ll<>0 THEN x$=RIGHT$(x$,ll)
NEXT
END SUB
DrawProblem:
LINE(0,10)-(115,115),bckgr,bf 'erase previous example
CALL DrawP(a,50)
nd1=LEN(STR$(a))-1:nd2=LEN(STR$(b))-1:IF nd1<nd2 THEN SWAP nd1,nd2
Xstart=34+24*(nd1>2):Ystart=64:clr1=bckgr:clr2=forgr
ON choice GOSUB Plus,Minus,Times,Divide
'SOUND RND*150+200,2,64,0: SOUND RND*150+200,2,64,1
'SOUND RND*150+200,2,64,2: SOUND RND*150+200,2,64,3
CALL DrawP(b,76)
LINE(62+24*(axb>=100 OR nd1=3),82)-(112,86),forgr,bf
RETURN
GetAnswer:
answer=0:nd=0 'nd is the number of entered digits
WaitAgain:
m=MOUSE(0):IF m=0 GOTO WaitAgain
WHILE MOUSE(0)<>0:WEND
x=MOUSE(1):y=MOUSE(2)
IF x>173 AND x<246 AND y>35 AND y<80 THEN CALL Flushlight(173,246,35,80):RETURN 'OK
IF x>173 AND x<246 AND y>92 AND y<136 THEN answer=0:nd=0:LINE (0,90)-(115,120),bckgr,bf:CALL Flushlight(173,246,92,136):GOTO WaitAgain
GOSUB SeeIfInteger:IF NOT intgr GOTO WaitAgain
FOR fl=0 TO 8
LINE(7+k*24,155)-(30+k*24,172),flush,bf
LINE(7+k*24,155)-(30+k*24,172),boxclr,bf
NEXT
CALL Move&(RP&,13+k*24,167):PRINT RIGHT$(STR$(k),1);
LINE(7+k*24,155)-(30+k*24,172),forgr,b
nd=nd+1
IF nd>4 THEN
answer=0:SAY TRANSLATE$("too large a number. sorry for that.")
LINE (0,90)-(115,115),bckgr,bf:nd=0
ELSE
answer=answer*10+k
IF MenuOn=0 THEN
GOSUB DisplayAnswer
ELSE
LOCATE 17,nd+3:PRINT RIGHT$(STR$(k),1)
END IF
END IF
GOTO WaitAgain
RETURN
SeeIfInteger:
intgr=0
IF y<155 OR y>172 THEN RETURN
IF x>7 AND x<30 THEN
intgr=-1:k=0
ELSEIF x>31 AND x<54 THEN
intgr=-1:k=1
ELSEIF x>55 AND x<78 THEN
intgr=-1:k=2
ELSEIF x>79 AND x<102 THEN
intgr=-1:k=3
ELSEIF x>103 AND x<126 THEN
intgr=-1:k=4
ELSEIF x>127 AND x<150 THEN
intgr=-1:k=5
ELSEIF x>151 AND x<174 THEN
intgr=-1:k=6
ELSEIF x>175 AND x<198 THEN
intgr=-1:k=7
ELSEIF x>199 AND x<222 THEN
intgr=-1:k=8
ELSEIF x>223 AND x<246 THEN
intgr=-1:k=9
END IF
RETURN
DisplayAnswer:
FOR scr=1 TO 8
SCROLL(0,90)-(112,115),-3,0
NEXT
PAINT(110,102),bckgr
'SOUND RND*150+350,2,64,0: SOUND RND*150+350,2,64,1
'SOUND RND*150+350,2,64,2: SOUND RND*150+350,2,64,3
CALL DisplayOneDigit(112,nd,nd,24,112,k)
RETURN
Correct:
score=score+1:SAY sp$(FIX(RND*(PosReply+1)))
RETURN
Wrong:
score=score-1:IF score<1 THEN score=1
SAY sp$(FIX((PosReply+1)+RND*NegReply))
a$=MID$(STR$(a),2):b$=MID$(STR$(b),2)
LOCATE 16,2:PRINT "Correct Result:":LOCATE 17,8
PRINT a$;sign$;b$;"=";MID$(STR$(axb),2)
CALL Waiting(3):LINE (0,120)-(60,150),bckgr,bf
RETURN RepeatAfterWrongAnswer
SUB Waiting(n) STATIC
FOR i=1 TO n:now$=TIME$:WHILE TIME$=now$:WEND:NEXT
END SUB
ChooseColors:
PALETTE bckgr,RND/4,RND/2,RND/2
PALETTE forgr,RND/8,(4+RND)/5,RND/2
PALETTE boxclr,(3+RND)/4,RND/4,RND/2
PALETTE flush,(3+RND)/4,(1+RND)/3,(3+RND)/8
IF RND<0.5 THEN SWAP forgr,bckgr
IF RND<0.5 THEN SWAP flush,boxclr
COLOR forgr,bckgr:CLS
RETURN
SUB Flushlight(x1,x2,y1,y2) STATIC
DEFINT a-z
SHARED flush,bckgr
FOR j=1 TO 3
FOR i=1 TO 6
PALETTE flush,(1+RND)/2,(1+RND)/2,(1+RND)/2
LINE(x1-i,y1-i)-(x2+i,y2+i),flush,b
NEXT
FOR i=6 TO 1 STEP -1
LINE(x1-i,y1-i)-(x2+i,y2+i),bckgr,b
NEXT
NEXT
END SUB
SUB DisplayOneDigit(Xptr,TotalLength,Xoffset,Xsize,Ystart,v) STATIC
SHARED stp,forgr,bckgr
DEFINT a-z
Xstart=Xptr-(TotalLength-Xoffset+1)*Xsize
PSET(Xstart,Ystart),bckgr
ON (v+1) GOSUB Digit0,Digit1,Digit2,Digit3,Digit4,Digit5,Digit6,Digit7,Digit8,Digit9
COLOR forgr
EXIT SUB
Digit0:
AREA STEP(0,-stp):AREA STEP(0,-8*stp):AREA STEP(stp,-stp)
AREA STEP(8*stp,0):AREA STEP(stp,stp):AREA STEP(0,8*stp)
AREA STEP(-stp,stp):AREA STEP(-8*stp,0):AREA STEP(-stp,-stp)
AREAFILL
PSET STEP(2*stp+1,-2-stp):AREA STEP(0,3-6*stp):AREA STEP(6*stp-3,0)
AREA STEP(3-6*stp,6*stp-3):COLOR bckgr:AREAFILL
PSET STEP(2*stp,1):AREA STEP(4*stp-2,2-4*stp):AREA STEP(0,4*stp-2)
AREA STEP(2-4*stp,0):AREAFILL
RETURN
END
Digit1:
AREA STEP(0,-2*stp):AREA STEP(4*stp,0):AREA STEP(0,-5*stp)
AREA STEP(-3*stp,0):AREA STEP(3*stp,-3*stp):AREA STEP(2*stp,0)
AREA STEP(0,8*stp):AREA STEP(4*stp,0):AREA STEP(0,2*stp)
AREA STEP(-10*stp,0):AREAFILL
RETURN
END
Digit2:
AREA STEP(0,-5*stp):AREA STEP(stp,-stp):AREA STEP(7*stp,0)
AREA STEP(0,-2*stp):AREA STEP(-6*stp,0):AREA STEP(0,stp)
AREA STEP(-2*stp,0):AREA STEP(0,-2*stp):AREA STEP(stp,-stp)
AREA STEP(8*stp,0):AREA STEP(stp,stp):AREA STEP(0,4*stp)
AREA STEP(-stp,stp):AREA STEP(-7*stp,0):AREA STEP(0,2*stp)
AREA STEP(8*stp,0):AREA STEP(0,2*stp):AREA STEP(-10*stp,0)
AREAFILL
RETURN
END
Digit3:
AREA STEP(0,-2*stp):AREA STEP(8*stp,0):AREA STEP(0,-2*stp)
AREA STEP(-6*stp,0):AREA STEP(0,-2*stp):AREA STEP(6*stp,0)
AREA STEP(0,-2*stp):AREA STEP(-8*stp,0):AREA STEP(0,-2*stp)
AREA STEP(9*stp,0):AREA STEP(stp,stp):AREA STEP(0,3*stp)
AREA STEP(-stp,stp):AREA STEP(stp,stp):AREA STEP(0,3*stp)
AREA STEP(-stp,stp):AREA STEP(-9*stp,0)
AREAFILL
RETURN
END
Digit4:
PSET STEP(6*stp,0),bcgr
AREA STEP(0,-4*stp):AREA STEP(-6*stp,0):AREA STEP(0,-6*stp)
AREA STEP(2*stp,0):AREA STEP(0,4*stp):AREA STEP(4*stp,0)
AREA STEP(0,-4*stp):AREA STEP(2*stp,0):AREA STEP(0,4*stp)
AREA STEP(2*stp,0):AREA STEP(0,2*stp):AREA STEP(-2*stp,0)
AREA STEP(0,4*stp):AREA STEP(-2*stp,0)
AREAFILL
RETURN
END
Digit5:
PSET STEP(0,-stp),bckgr
AREA STEP(0,-2*stp):AREA STEP(2*stp,0):AREA STEP(0,stp)
AREA STEP(6*stp,0):AREA STEP(0,-2*stp):AREA STEP(-7*stp,0)
AREA STEP(-stp,-stp):AREA STEP(0,-5*stp):AREA STEP(10*stp,0)
AREA STEP(0,2*stp):AREA STEP(-8*stp,0):AREA STEP(0,2*stp)
AREA STEP(7*stp,0):AREA STEP(stp,stp):AREA STEP(0,4*stp)
AREA STEP(-stp,stp):AREA STEP(-8*stp,0):AREA STEP(-stp,-stp)
AREAFILL
RETURN
END
Digit6:
PSET STEP(0,-stp),bckgr
AREA STEP(0,-8*stp):AREA STEP(stp,-stp):AREA STEP(9*stp,0)
AREA STEP(0,2*stp):AREA STEP(-8*stp,0):AREA STEP(0,2*stp)
AREA STEP(7*stp,0):AREA STEP(stp,stp):AREA STEP(0,4*stp)
AREA STEP(-stp,stp):AREA STEP(-8*stp,0):AREA STEP(-stp,-stp)
AREAFILL
PSET STEP(2*stp,-stp):AREA STEP(1,-2*stp+1)
AREA STEP(6*stp-2,0):AREA STEP(0,2*stp-2):AREA STEP(-6*stp+2,0)
COLOR bckgr:AREAFILL
RETURN
END
Digit7:
AREA STEP(8*stp,-8*stp):AREA STEP(-6*stp,0):AREA STEP(0,stp)
AREA STEP(-2*stp,0):AREA STEP(0,-3*stp):AREA STEP(11*stp,0)
AREA STEP(0,2*stp):AREA STEP(-8*stp,8*stp):AREA STEP(-3*stp,0)
AREAFILL
RETURN
END
Digit8:
AREA STEP(0,-stp)
AREA STEP(0,-3*stp):AREA STEP(stp,-stp):AREA STEP(-stp,-stp)
AREA STEP(0,-3*stp):AREA STEP(stp,-stp):AREA STEP(8*stp,0)
AREA STEP(stp,stp):AREA STEP(0,3*stp):AREA STEP(-stp,stp)
AREA STEP(stp,stp):AREA STEP(0,3*stp):AREA STEP(-stp,stp)
AREA STEP(-8*stp,0):AREA STEP(-stp,-stp)
AREAFILL
AREA STEP(1+2*stp,1-3*stp)
AREA STEP(6*stp-2,0):AREA STEP(0,2*stp-2):AREA STEP(2-6*stp,0)
COLOR bckgr:AREAFILL
AREA STEP(0,1-6*stp):AREA STEP(6*stp-2,0)
AREA STEP(0,2*stp-2):AREA STEP(2-6*stp,0)
AREAFILL
RETURN
END
Digit9:
AREA STEP(0,-2*stp):AREA STEP(8*stp,0):AREA STEP(0,-2*stp)
AREA STEP(-7*stp,0):AREA STEP(-stp,-stp):AREA STEP(0,-4*stp)
AREA STEP(stp,-stp):AREA STEP(8*stp,0):AREA STEP(stp,stp)
AREA STEP(0,8*stp):AREA STEP(-stp,stp):AREA STEP(-9*stp,0)
AREAFILL
PSET STEP(8*stp,-8*stp):AREA STEP(-1,2*stp-1)
AREA STEP(2-6*stp,0):AREA STEP(0,2-2*stp):AREA STEP(6*stp-2,0)
COLOR bckgr:AREAFILL
RETURN
END
END SUB
Plus:
PSET(Xstart,Ystart),clr1:AREA STEP(0,-4*stp):AREA STEP(0,-2*stp)
AREA STEP(4*stp,0):AREA STEP(0,-4*stp):AREA STEP(2*stp,0)
AREA STEP(0,4*stp):AREA STEP(4*stp,0):AREA STEP(0,2*stp)
AREA STEP(-4*stp,0):AREA STEP(0,4*stp):AREA STEP(-2*stp,0)
AREA STEP(0,-4*stp):AREA STEP(-4*stp,0)
COLOR clr2:AREAFILL
RETURN
END
Minus:
PSET(Xstart,Ystart),clr1:AREA STEP(0,-4*stp):AREA STEP(0,-2*stp)
AREA STEP(10*stp,0):AREA STEP(0,2*stp):AREA STEP(-10*stp,0)
COLOR clr2:AREAFILL
RETURN
END
Times:
PSET(Xstart,Ystart),clr1:AREA STEP(0,-stp):AREA STEP(4*stp,-4*stp)
AREA STEP(-4*stp,-4*stp):AREA STEP(0,-stp):AREA STEP(stp,0)
AREA STEP(4*stp,4*stp):AREA STEP(4*stp,-4*stp):AREA STEP(stp,0)
AREA STEP(0,stp):AREA STEP(-4*stp,4*stp):AREA STEP(4*stp,4*stp)
AREA STEP(0,stp):AREA STEP(-stp,0):AREA STEP(-4*stp,-4*stp)
AREA STEP(-4*stp,4*stp):AREA STEP(-stp,0)
COLOR clr2:AREAFILL
RETURN
END
Divide:
PSET(Xstart,Ystart),clr1:AREA STEP(0,-4*stp):AREA STEP(0,-2*stp)
AREA STEP(10*stp,0):AREA STEP(0,2*stp):AREA STEP(-10*stp,0)
COLOR clr2:AREAFILL
CIRCLE(Xstart+5*stp,Ystart-9*stp),stp*1.4
PAINT(Xstart+5*stp,Ystart-9*stp),clr2
CIRCLE(Xstart+5*stp,Ystart-stp),stp*1.4
PAINT(Xstart+5*stp,Ystart-stp),clr2
RETURN
END
SetMenu:
MENU 1,0,1,"Operation"
MENU 1,1,1,"Addition"
MENU 1,2,1,"Subtraction"
MENU 1,3,1,"Multiplication"
MENU 1,4,1,"Division"
MENU 1,5,1,"Quit"
MENU 2,0,1,"Maximum"
MENU 2,1,1," 10"
MENU 2,2,1," 100"
MENU 2,3,1," Define"
MENU 2,4,1,"Display"
MENU ON
RETURN
END
Op:
oldchoice=MENU(1)
IF oldchoice<3 AND Maximum>1000 THEN Maximum=1000
IF oldchoice>2 AND Maximum>31 THEN Maximum=31
RETURN
END
MaxNum:
IF MENU(1)=1 THEN
Maximum=10:RETURN
END IF
IF MENU(1)=2 THEN
Maximum=100:IF oldchoice>2 THEN Maximum=31
RETURN
END IF
IF MENU(1)=4 THEN GOSUB DisplayMaximum:RETURN
TryAgain:
LINE(5,120)-(130,140),bckgr,bf
LOCATE 16,2:PRINT "Maximum Number";
LOCATE 17,2:PRINT CHR$(62);" ";
answTemporary=answer:ndTemporary=nd
GOSUB GetAnswer:Maximum=answer:answer=answTemporary:nd=ndTemporary
IF oldchoice<3 AND Maximum>1000 THEN TryAgain
IF oldchoice>2 AND Maximum>31 THEN TryAgain
LINE(5,120)-(150,152),bckgr,bf
RETURN
END
ProcessMenu:
MenuOn=MENU(0)
ON MenuOn GOSUB Op,MaxNum
MenuOn=0
RETURN
END
DisplayMaximum:
LOCATE 16,2:PRINT "Maximum Number";
LOCATE 17,2:PRINT CHR$(62);" ";Maximum
WHILE MOUSE(0)=0:WEND
LINE(5,120)-(150,152),bckgr,bf
RETURN